/**
 * JS Object used to store the last clicked checkbox for each set of
 * checkboxes. See method below for usage details.
 */
var lastClickedIndexes = new Object();

function countCheckedCheckbox(checksName)
{
	checkBoxes = document.getElementsByName(checksName);
	
	count = 0;
	
	for (i = 0; i < checkBoxes.length; i++) 
	{
		if(checkBoxes[i].checked)
			count++;
	}
	
	return count;
}

/**
 * If called by a checkbox when the checkbox is clicked, will manage the
 * selection/deselection of a range of checkboxes when the Shift key
 * is held down during the click.
 *
 * @param clickedCheckbox - the checkbox originating the event
 * @param event - the onclick event itself
 */
function handleCheckboxRangeSelection(clickedCheckbox, event) 
{
	// Find the position of the checkbox in the array of checkboxes
	checkBoxes = document.getElementsByName(clickedCheckbox.name);
	var clickedIndex;

	for (i = 0; i < checkBoxes.length; i++) 
	{
		if (clickedCheckbox.value == checkBoxes[i].value) 
		{
			clickedIndex = i;
			break;
		}
	}

	// Fetch the index of the last clicked checkbox for this set of checkboxes
	lastClickedIndex = lastClickedIndexes[clickedCheckbox.name];

	// If the shift key was pressed, and we have a previously clicked
	// checkbox, "click" the whole range
	if ((event.shiftKey == true) && (lastClickedIndex != null))  
	{
		startId = Math.min(lastClickedIndex, clickedIndex);
		endId   = Math.max(lastClickedIndex, clickedIndex);

		for (i=startId; i<=endId; i++) 
		{
			checkBoxes[i].checked = clickedCheckbox.checked;
		}
	}

	// Store the new checkbox index as the last clicked one
	lastClickedIndexes[clickedCheckbox.name] = clickedIndex;
		
}

/**
 * formatParas passed to a function, remember that
 * javascript function always has varargs so you can pass
 * the number of arguments you want, this function
 * return a well format args array rapresentation
 *
 * @param frm - form that sumit event
 */
function formatParams(arguments)
{
	var elements = new Array();

  	for (var i = 0; i < arguments.length; i++) 
  	{
    	var element = arguments[i];
    
    	elements.push(element);
  	}
  
  	return elements.inspect();
}


/**
 * called to toggle the state in a check box list ex.: a datatable
 * 
 * @param fmobj - form contenente i checkbox
 * @param name - name of checks to toggle selected/unselected
 * @param control - control check to select/unselect previously
 */
 
function checksAll(checkboxesName, controlObj) 
{

	var checks = document.getElementsByName(checkboxesName);
	
	if (checks != null && checks.length > 0)
	{		
		for (var i = 0; i < checks.length; i++) 
	  	{	    	
	    	if ((checks[i].name == checkboxesName) && (checks[i].type == 'checkbox') && !checks[i].disabled) 
	    	{	      		
				if($(controlObj).checked)
					checks[i].checked = true;
				else
					checks[i].checked = false;
	    	}
	  	} 
  	}
  	else
  		alert('there is no checkboxes with name : ' + name);
  	
}

/**
 * prepare HTML to display in a DHTML_modalMessage o any other
 * custom message box, if you pass a null insted of 'cancFunctionName'
 * no Cancel button wll be displayed
 * 
 * @param message - message beeing displayed
 * @param icon - icon to display in message box
 * @param okFunctionName - name of function called when user click Ok
 * @param cancFunctionName - name of function called when user click Cancel
 */
function prepareMessage(message, icon, okFunctionName, cancFunctionName)
{
	okButton = '';
	cancelButton = '';
	
	if (okFunctionName != null)
		okButton = '		<a href="#" onclick="' + okFunctionName + '(); return false;" style="padding-right: 10px;font-weight: bold;width: 25px;">Ok</a>\n';
		
	if (cancFunctionName != null)
		cancelButton = '		<a href="#" onclick="' + cancFunctionName + '(); return false;" style="font-weight: bold;width: 25px;">Cancel</a>\n';	
		
	content = 	'\n' +				
				'<table border="0" style="width:100%; height:100%; border:1px #DEDEDE solid;">\n' +
				'<tr>' +
				'	<td  style="padding:5px;"><img src="' + icon + '" /></td>\n' +
				'	<td style="padding:5px; color:red; font-weight: bold;">\n' +
				message + '\n' +
				'	</td>\n' +
				'</tr>\n' +
				'<tr>\n' +	
				'	<td style="padding:5px;">&nbsp;</td>\n' +
				'	<td style="height:20px; padding:10px;">\n' +
				okButton +
				cancelButton +
				'	</td>\n' +
				'</tr>\n' +
				'</table>\n';
					
	return content;
}

//******* SCRIPT PER L'APERTURA DEL DIV di debug  **********
function toggleLayer(whichLayer)
{
	if (document.getElementById)
	{
		// this is the way the standards work
		var style2 = document.getElementById(whichLayer).style;		
		style2.display = style2.display ? "":"block";
	}
	else if (document.all)
	{
		// this is the way old msie versions work
		var style2 = document.all[whichLayer].style;
		style2.display = style2.display ? "":"block";
	}
	else if (document.layers)
	{
		// this is the way nn4 works
		var style2 = document.layers[whichLayer].style;
		style2.display = style2.display ? "":"block";
	}
}

/**
 * Extension to the string object  
 *
 */
function trim() 
{
   return this.replace(/\s+$|^\s+/g,"");
}

function lTrim() 
{
   return this.replace(/^\s+/,"");
}

function rTrim() 
{
   return this.replace(/\s+$/,"");
}
	
String.prototype.trim = trim;	
String.prototype.rTrim = rTrim;	
String.prototype.lTrim = lTrim;	


//*************************************************
//******* SCRIPT PER L'APERTURA DELL'HELP **********

function closeResize()
{
	if (!opener.closed)
	{
		sw = screen.width;
		sh = screen.height;
		sah = screen.availHeight;
		opener.moveTo(0,0);
		opener.resizeTo(sw,sh);
	}
}


function openResize()
{
	var app = navigator.appName.toLowerCase();
	//alert(app);
	sw = screen.width;
	sh = screen.height;
	W = 230;
	opener.moveTo(0,0);
	if (app.indexOf('netscape') >= 0)
		opener.resizeTo(sw-W-24,sh-185);
	else
		opener.resizeTo(sw-W-12,sh-27);
}

function show()
{
	sw = screen.width;
	sh = screen.height;
	W = 230;
	H = sh-58;
	stringTool="toolbar=0,status=0,menubar=0,width="+W+",height="+H+",left="+(sw-W-12)+",top=0,resizable=1";
	window.open(baseUrl + '/help.jsp','new',stringTool);
}

function navBar( tableCellRef, hoverFlag)
{
	if ( hoverFlag )
	{
		tableCellRef.style.backgroundColor = '#EAEBED';
	}
	else
	{
		tableCellRef.style.backgroundColor = '';
	}
}


/**
 * Restituisce un oggetto Javascript Date corrispondente alla stringa passata come
 * argomento. Attualmente le date devono essere stringhe nel formato dd/MM/YYYY HH:mm.
*/

function parseDate(data, formato)
{
	// Estrae giorno, mese, anno dalla data
	var giorno = data.substring(0, 2);
	var mese = data.substring(3, 5);
	var anno = data.substring(6, 10);
	var ore = data.substring(11,13);
	var minuti = data.substring(14,16);



	// Controlla se ci sono problemi

	if ( isNaN(giorno) || isNaN(mese) || isNaN(anno) || isNaN(ore) || isNaN(minuti))
		alert("La data " + data + " ha un formato errato!" );

	// Restituisce la data
	return new Date(anno, mese - 1, giorno,ore,minuti,00);
}


/**
 * Confronta due date JavaScript.
 * Restituisce la differenza in giorni tra la data <data1> e
 * la data <data2>.
*/

function dateDiff(data1, data2)
{

	var SECOND = 1000; 			// N. di millisecondi in un secondo
	var MINUTE = SECOND * 60; 	// N. di millisecondi in un minuto
	var HOUR = MINUTE * 60; 	// N. di millisecondi in un ora
	var DAY = HOUR * 24; 		// N. di millisecondi in un giorno
	var WEEK = DAY * 7; 		// N. di millisecondi in una settimana

	// Ottiene la differenza in millisecondi

	var difference = dateCompare(data1, data2);

	// Restituisce il numero di giorni

	return Math.round(difference / DAY);
}

// ritorna data+(days,months,years)
function evaluateOffsetDate(data,days,months,years,hours,minutes) {

	var dataScadenza = data;
	
	dataScadenza.setMinutes(dataScadenza.getMinutes()+minutes);
	dataScadenza.setHours(dataScadenza.getHours()+hours);
	dataScadenza.setDate(dataScadenza.getDate()+days);
	dataScadenza.setMonth(dataScadenza.getMonth()+months);
	dataScadenza.setFullYear(dataScadenza.getFullYear()+years);

	return dataScadenza;
}

/**
 * Confronta due date JavaScript solo controllando giorno mese anno.
 * Restituisce la differenza in millisecondi tra la data <data1>
 * e la data <data2>.
 * Quindi la funzione restituisce un numero minore, uguale o maggiore di
 * zero a seconda che <data1> sia minore, uguale o maggiore di <data2>.
*/

function dateCompare(data1, data2)
{
	// Controlla se ci sono errori

	if ( isNaN(data1) || isNaN(data2) )
		alert("Problemi durante la conversione delle date");

	// Estrae i millisecondi dalle date
	var time1 = Date.UTC(data1.getYear(), data1.getMonth(), data1.getDate());
	var time2 = Date.UTC(data2.getYear(), data2.getMonth(), data2.getDate());
	// Calcola la differenza e restituisce il risultato

	var difference = time1 - time2;

	return difference;
}

/**
 * Confronta due date JavaScript solo controllando giorno mese anno ore e minuti.
 * Restituisce la differenza in millisecondi tra la data <data1>
 * e la data <data2>.
 * Quindi la funzione restituisce un numero minore, uguale o maggiore di
 * zero a seconda che <data1> sia minore, uguale o maggiore di <data2>.
*/

function dateCompareMillis(data1, data2)
{
	// Controlla se ci sono errori

	if ( isNaN(data1) || isNaN(data2) )
		alert("Problemi durante la conversione delle date");

	// Estrae i millisecondi dalle date
	var time1 = Date.UTC(data1.getYear(), data1.getMonth(), data1.getDate(), data1.getHours(), data1.getMinutes());
	var time2 = Date.UTC(data2.getYear(), data2.getMonth(), data2.getDate(), data2.getHours(), data2.getMinutes());
	// Calcola la differenza e restituisce il risultato

	var difference = time1 - time2;

	return difference;
}


/**
 * La funzione parseIntDec funziona come la funzione JavaScript parseInt.
 * La funzione parseIntDec considera la stringa passata come un numero
 * intero comunque in formato decimale. La funzione parseInt, invece,
 * considera in formato ottale i numeri che iniziano con uno 0.
*/


function parseIntDec(string)
{
	while (string.substring(0,1) == "0")
		string = string.substring(1);

	return parseInt(string);
}

/**
 * La funzione setScreenInfo controlla attraverso JavaScript la risoluzione
 * video usata dall'utente. Se la risoluzione e' stabilita correttamente,
 * viene inserito in sessione un Cookie contenente il valore della risoluzione
 * nel formato 1024x768, 800x600, etc. Il Cookie scade al termine della sessione.
*/

function setScreenInfo()
{
	var screenSize;

	var width = screen.width;
	var height = screen.height;

	if ( !isNaN(width) && !isNaN(height) )
	{
		screenSize = width + "x" + height;
		document.cookie = "screensize=" + escape(screenSize);
	}
}

/**
 * Controlla quanto caratteri sono digitati in un box di testo.
 * Prende come parametri la textbox da controllare, il numero massimo di caratteri
 * disponobili e un textbox in cui visualizzare il conteggio dei caratteri disponibili.
 * Il textbox per il conteggio puo' non essere usato specificando null come parametro
 * della funzione.
 * La funzione restituisce true se il numero di caratteri rientra nel massimo specificato.
 * Se il numero dei caratteri digitati eccede il numero massimo specificato, la funzione
 * rimuove i caratteri in eccesso dalla textbox e restiruisce false;
*/
function countChars(textbox, max)
{
	var commento = textbox.value;
	var count = commento.length;

	if (count > max)
	{
		alert("Il testo del commento deve essere al massimo di "+max+" caratteri.");
		textbox.value = commento.substring(0,max);
		return false;
	}
	else
	{
		return true;
	}

}

function openCenteredWindow(url,title,width,height,features)
{
	if ( width == null ) width = 700;;
	if ( height == null ) height = 400;
	if ( features == null ) features = "scrollbars=yes,resizable=yes";

	var left = (screen.availWidth-width)/2;
	var top = (screen.availHeight-height)/2;

	window.open(url, null, features+",width="+width+",height="+height+",left="+left+",top="+top);

}


/**
 * Modifica l'attributo class dei tr presenti nel tbody delle tabella con class = applyToClass
 * settandolo a evenClass o oddClass a seconda che sia una riga pari o dispari.
 */
function tableStripe(applyToClass, evenClass, oddClass)
{
	var tables = document.getElementsByTagName("table");

	if(tables == null)
		return;

	for(var table = 0; table < tables.length; table++)
	{
		if(tables[table].className == applyToClass)
		{
			var tableBody = tables[table].getElementsByTagName('tbody')[0];
			if(tableBody.rows)
	  		{
	  			for(var i = 0; i < tableBody.rows.length; i++)
	  			{
	  				var rowClass;
	  				if(i % 2 == 1)
	  					rowClass = evenClass;
	  				else
	  					rowClass = oddClass;
	  				if(tableBody.rows[i] != null)
						rowClass = tableBody.rows[i].className + " " + rowClass;
					tableBody.rows[i].className = rowClass;
	  			}
	  		}
  		}
	}
}

function getMouseX(event)
{
	var posx = 0;
	if (!e) var e = window.event;
	if (e.pageX)
	{
		posx = e.pageX;
	}
	else if (e.clientX)
	{
		posx = e.clientX + document.body.scrollLeft;
	}
	return posx;
}

function getMouseY(event)
{
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageY)
	{
		posy = e.pageY;
	}
	else if (e.clientY)
	{
		posy = e.clientY + document.body.scrollTop;
	}

	return posy;
}

function addClass(element, className)
{
	if(element.className == "")
		element.className = className;
	else if(element.className.indexOf(className) < 0)
		element.className = element.className + " " + className;
}

function removeClass(element, className)
{
	var oldClass = element.className;
	if(oldClass.indexOf(className) >= 0)
	{
		var left = oldClass.indexOf(className);
		var right = left + className.length;
		var result = oldClass.substring(0, left);
		if(right < oldClass.length)
			result += oldClass.substring(right, oldClass.length);
		if(result.charAt(0) == " ")
			result = result.substring(1);
		element.className = result;
	}
}

function toggleVisibility(elementId)
{
	var element = document.getElementById(elementId);
	if(element.style.display == 'none')
		element.style.display = '';
	else
		element.style.display = 'none';
}
